﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using AgencyEntityLib.BaseEntity;
using Ecopsy.DataTier;

namespace Grishko.UI
{
    /// <summary>
    /// Дерево справочника - листами которого являются RadioButton
    /// </summary>
    public class TreeDictionaryControl_Rb :TreeControl 
    {
        public enum SelectedType {MultiSelect,RbSelect} ;

        private SelectedType _SelectedMode = SelectedType.RbSelect;
        public SelectedType SelectedMode { get { return _SelectedMode; } set { _SelectedMode = value; } }

        private const string SelectedNodePref           = "_SelNode";
        private const string TreeDictionaryPref         = "_TreeDictionaryID";
        private const string TreeDictionaryFolderPref   = "_TreeDictionaryFolderID";

        string _SelectedNodeID = Guid.NewGuid().ToString();
        //Id скрытого поля - хранилище SelectedNode
        protected string hf_SelectedNodeID { get { return this.ID + SelectedNodePref; } }
        //Id скрытого поля - хранилище TreeDictionaryID
        protected string hf_TreeDictionaryID { get { return this.ID + TreeDictionaryPref; } }

        //Id скрытого поля - хранилище TreeDictionaryFolderID
        protected string hf_TreeDictionaryFolderID { get { return this.ID + TreeDictionaryFolderPref; } }


        public TreeDictionaryControl_Rb()
            : base()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        
        protected string GetChBoxId(TreeEntitySingle nd)
        {
            return nd.ID;
        }

        /// <summary>
        /// Разрешение - чекбокс нажат отжат 
        /// </summary>
        /// <param name="_nd"></param>
        /// <returns></returns>
        protected virtual bool MyOnChBind(TreeEntitySingle _nd)
        {
            if (null == TreeDictionaryItemValue)
                return false;

            if (null == _nd.ParentNode)
                return false;

            TreeDictionaryItem nd = (TreeDictionaryItem)_nd;

            HashSet<DictionaryItem> ds = TreeDictionaryItemValue.ValueToHashSet();

            return (ds.Contains(nd as DictionaryItem));


        }
                
        protected override System.Web.UI.Control F_BuildNode(Ecopsy.DataTier.TreeEntitySingle nd)
        {
            System.Web.UI.Control res;
            
            res = Call_BuildNodeEvent(this, nd);


            if (null == res)
            {
                if (nd.ChildNodes.Count == 0)
                {
                    CheckBox rb = new CheckBox();
                    rb.ID = GetChBoxId(nd);
                    rb.CssClass = CssNode;
                    rb.Text = (nd as TreeDictionaryItem).Name;

                    if (MyOnChBind(nd))
                    {
                        rb.Checked = true;
                        _SelectedNodeAsString = _SelectedNodeAsString + nd.ID + ",";
                    }

                    // Прицепить скрипт по отбору элементов                    
                        bool  bRbMode=_SelectedMode == SelectedType.RbSelect;
                        string[] Att = { GetRootId(), GetChBoxId(nd), hf_SelectedNodeID, bRbMode.ToString ().ToLower () };
                        rb.InputAttributes.Add("onclick", string.Format("OnTreeRbClick('{0}','{1}','{2}',{3});", Att));                                                

                    res= rb;


                }
                else
                {
                    Label l = new Label() { Text = (nd as TreeDictionaryItem).Name };
                    res = l;
                }
            }
            
           return res;

           
        }


        protected override void OnBefore_RenderControl(ref Panel Root)
        {
            ///Формируем хранилища для выбранных нод, ид папки справочника , ид типа справочника
            HiddenField hfSelectedNode = new HiddenField() { ID = hf_SelectedNodeID, Value = _SelectedNodeAsString };
            Root.Controls.Add(hfSelectedNode);
            hfSelectedNode = new HiddenField() { ID = hf_TreeDictionaryFolderID, Value = TreeDictionaryFolderID };
            Root.Controls.Add(hfSelectedNode);
            hfSelectedNode = new HiddenField() { ID = hf_TreeDictionaryID, Value = TreeDictionaryID };
            Root.Controls.Add(hfSelectedNode);
             
        }
        
        /// <summary>
        /// Функция источник данных 
        /// 
        /// </summary>
        public Func<TreeDictionaryItem> F_DataSource = null;
        
        /// <summary>
        /// В качестве источника выступает TreeDictionary, если существует F_DataSource (функ. поставщик)  - то это источник
        /// иначе формируем справочник на основе _TreeDictionaryItemValue
        /// 
        /// </summary>
        public override TreeDictionaryItem DataSource
        {
            get
            {
                if (null != F_DataSource)
                        return F_DataSource();


                if (null != _DataSource)
                         throw new Exception ("Использование DataSource в качестве источника данных запрещено. Используйте TreeDictionaryItemValue/F_DataSource ");
                                
                if (null != _TreeDictionaryItemValue)
                    return TreeDictionaryItem.GetTreeDictionary(_TreeDictionaryItemValue.TreeDictionaryFolderID, _TreeDictionaryItemValue.ID);

                

                return null; 
                    //TreeDictionaryItem.GetTreeDictionary(TreeDictionaryFolderID, TreeDictionaryID);
            }
            set 
            {                
                   throw new Exception("Использование DataSource в качестве источника данных запрещено. Используйте TreeDictionaryItemValue. ");

            }


        }

        /// <summary>
        /// Значение считанное из дерева
        /// </summary>        
        private TreeDictionaryItemValue _TreeDictionaryItemValue = null;
        public TreeDictionaryItemValue TreeDictionaryItemValue
        {
            get { return GetTreeDictionaryItemValue(); }
            set { _TreeDictionaryItemValue = value; }
        }

        /// <summary>
        /// Стоит значение на основе TreeDictionaryID,TreeDictionaryFolderID,SelectedListId 
        /// </summary>
        /// <returns></returns>
        protected virtual TreeDictionaryItemValue GetTreeDictionaryItemValue()
        {            

            if (null != _TreeDictionaryItemValue)
                                    return _TreeDictionaryItemValue;

            if (SelectedListId.Length == 0) 
                                    return null;

            TreeDictionaryItem ti = GetTreeDictionaryItem();            
            TreeDictionaryItemValue res = ti.BuildValue(SelectedListId[0]);
            foreach (string i in SelectedListId)
            {
                TreeDictionaryItemValue av = ti.BuildValue(i);
                res.AddValue(av);
            }
            return res;
        }

        private TreeDictionaryItem GetTreeDictionaryItem()
        {


            if(null== F_DataSource )
                return TreeDictionaryItem.GetTreeDictionary(TreeDictionaryFolderID, TreeDictionaryID);

            return F_DataSource();
        }

        public string[] SelectedListId
        {
            get
            {
                List<string> l = new List<string>();
                string s = HttpContext.Current.Request.Form[hf_SelectedNodeID];
                
                if(string.IsNullOrEmpty (s))
                                return l.ToArray();
                
                foreach (string i in s.Split(",".ToCharArray()))
                {
                    if (i.Length > 0)
                        l.Add(i);
                }
                return l.ToArray();

            }

        }

        protected string TreeDictionaryID
        {
            get
            {
                if (_TreeDictionaryItemValue == null)
                    return HttpContext.Current.Request.Form[hf_TreeDictionaryID];
                return TreeDictionaryItemValue.ID;
            }
        }

        protected string _SelectedNodeAsString = string.Empty;

        protected string SelectedNodeList
        {
            get
            {
                if (_TreeDictionaryItemValue == null)
                    return HttpContext.Current.Request.Form[hf_SelectedNodeID];
                return _SelectedNodeAsString;
            }
        }

        protected string TreeDictionaryFolderID
        {
            get
            {                   
                if (_TreeDictionaryItemValue == null)
                    return HttpContext.Current.Request.Form[hf_TreeDictionaryFolderID];
                else 
                    return TreeDictionaryItemValue.TreeDictionaryFolderID;



            }
        }

    }
}
